﻿#define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param array int整型vector
     * @return int整型
     */
    int FindGreatestSumOfSubArray(vector<int>& array)
    {
        int* dp = new int[array.size()];
        dp[0] = array[0];
        int Max_value = dp[0];
        for (int i = 1; i < array.size(); ++i)
        {
            dp[i] = max(dp[i - 1] + array[i], array[i]);

            if (dp[i] > Max_value)
            {
                Max_value = dp[i];
            }
        }
        delete[] dp;
        return Max_value;
    }
};

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param array int整型vector
     * @return int整型
     */
    int FindGreatestSumOfSubArray(vector<int>& array)
    {
        int value = array[0];
        int Max_value = array[0];
        for (int i = 1; i < array.size(); ++i)
        {
            if (value <= 0)//value小于等于0，肯定会减小array[i]，不然直接从array[i]开始
            {
                value = array[i];
            }
            else
            {
                value += array[i];
            }

            if (value > Max_value)
            {
                Max_value = value;
            }
        }
        return Max_value;
    }
};

/*
描述
输入一个长度为n的整型数组array，数组中的一个或连续多个整数组成一个子数组，子数组最小长度为1。求所有子数组的和的最大值。
数据范围:1<=n<=2×10^5，−100<=a[i]<=100

要求:时间复杂度为O(n)，空间复杂度为O(n)
进阶:时间复杂度为O(n)，空间复杂度为O(1)

示例1
输入：
[1,-2,3,10,-4,7,2,-5]
复制
返回值：
18

说明：
经分析可知，输入数组的子数组[3,10,-4,7,2]可以求得最大和为18
*/

